package com.ruoyi.business.communication.domain;

import java.io.Serializable;
import java.util.Arrays;

/**
 * 槽的点位时间配置
 * - 点位数：4 或 6（参考 PositionCountPerSlot）
 * - 业务槽号：businessSlotNo
 * - 点位1-6的打壳时间（单位：0.1秒，示例：25 = 2.5秒）
 * - 点位1-6的换极阶段1/阶段2时间（单位：分钟，示例：10 = 10分钟）
 */
public class SlotTiming implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 点位数量：FOUR 或 SIX */
    private PositionCountPerSlot positionCountPerSlot;

    /** 业务槽号 */
    private Integer businessSlotNo;

    /** 打壳时间（单位：0.1秒，索引1..6；超过当前点位数的索引应忽略或保持null） */
    private final Integer[] strikeTimeDeciSeconds = new Integer[6];

    /** 换极阶段1时间（单位：分钟，索引1..6） */
    private final Integer[] stage1Minutes = new Integer[6];

    /** 换极阶段2时间（单位：分钟，索引1..6） */
    private final Integer[] stage2Minutes = new Integer[6];

    public SlotTiming() {}

    public SlotTiming(PositionCountPerSlot positionCountPerSlot, Integer businessSlotNo) {
        this.positionCountPerSlot = positionCountPerSlot;
        this.businessSlotNo = businessSlotNo;
    }

    // -------------------- 便捷读写（按业务含义） --------------------

    /** 设置指定点位的打壳时间（秒，支持小数，例如2.5秒） */
    public void setStrikeTimeSeconds(int positionIndex, Double seconds) {
        validatePositionIndex(positionIndex);
        if (seconds == null) { strikeTimeDeciSeconds[positionIndex - 1] = null; return; }
        int tenths = (int) Math.round(seconds * 10.0);
        strikeTimeDeciSeconds[positionIndex - 1] = tenths;
    }

    /** 获取指定点位的打壳时间（秒），null表示未设置 */
    public Double getStrikeTimeSeconds(int positionIndex) {
        validatePositionIndex(positionIndex);
        Integer tenths = strikeTimeDeciSeconds[positionIndex - 1];
        return tenths == null ? null : tenths / 10.0;
    }

    /** 原始打壳时间（单位：0.1秒）读写 */
    public void setStrikeTimeRaw(int positionIndex, Integer tenths) {
        validatePositionIndex(positionIndex);
        strikeTimeDeciSeconds[positionIndex - 1] = tenths;
    }

    public Integer getStrikeTimeRaw(int positionIndex) {
        validatePositionIndex(positionIndex);
        return strikeTimeDeciSeconds[positionIndex - 1];
    }

    /** 设置/获取换极阶段1时间（分钟） */
    public void setStage1Minutes(int positionIndex, Integer minutes) {
        validatePositionIndex(positionIndex);
        stage1Minutes[positionIndex - 1] = minutes;
    }

    public Integer getStage1Minutes(int positionIndex) {
        validatePositionIndex(positionIndex);
        return stage1Minutes[positionIndex - 1];
    }

    /** 设置/获取换极阶段2时间（分钟） */
    public void setStage2Minutes(int positionIndex, Integer minutes) {
        validatePositionIndex(positionIndex);
        stage2Minutes[positionIndex - 1] = minutes;
    }

    public Integer getStage2Minutes(int positionIndex) {
        validatePositionIndex(positionIndex);
        return stage2Minutes[positionIndex - 1];
    }

    // -------------------- 批量访问器 --------------------

    /** 返回长度为6的副本数组（单位：0.1秒） */
    public Integer[] getStrikeTimeRawAll() { return Arrays.copyOf(strikeTimeDeciSeconds, 6); }
    public Integer[] getStage1MinutesAll() { return Arrays.copyOf(stage1Minutes, 6); }
    public Integer[] getStage2MinutesAll() { return Arrays.copyOf(stage2Minutes, 6); }

    // -------------------- 校验 --------------------

    private void validatePositionIndex(int positionIndex) {
        int max = positionCountPerSlot == PositionCountPerSlot.SIX ? 6 : 4;
        if (positionIndex < 1 || positionIndex > max) {
            throw new IllegalArgumentException("点位索引应在1.." + max);
        }
    }

    // -------------------- Getter / Setter --------------------

    public PositionCountPerSlot getPositionCountPerSlot() { return positionCountPerSlot; }
    public void setPositionCountPerSlot(PositionCountPerSlot positionCountPerSlot) { this.positionCountPerSlot = positionCountPerSlot; }

    public Integer getBusinessSlotNo() { return businessSlotNo; }
    public void setBusinessSlotNo(Integer businessSlotNo) { this.businessSlotNo = businessSlotNo; }
}


